Snowflakeで知っていると便利なシステム関数についてまとめてみた~制御機能編~  #SnowflakeDB

Snowflakeで知っていると便利なシステム関数についてまとめてみた~制御機能編~ #SnowflakeDB

Clock Icon2021.12.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

※本エントリは、Snowflakeをより使いこなそう! Advent Calendar 2021の13日目の記事となります。

さがらです。

Snowflakeのシステム関数のうち制御機能を持つ関数について、知っていると便利なものを本記事でまとめてみます。

システム関数とは

システム関数とは、以下の3種類に分類される、システムに関連した動作をする関数です。

  • システムでアクションを実行できるようにする制御機能(例:クエリの中止)
  • システムに関する情報を返す情報関数(例:テーブルのクラスタリングの深さの計算)
  • クエリに関する情報を返す情報関数(例: EXPLAIN プランに関する情報)

システム関数に関する公式Docは下記になります。

この記事では、このうちの「システムでアクションを実行できるようにする制御機能」について個人的に知っていると便利だと感じる関数を説明します。

実行中のセッションを停止したい

外部からコネクタなどを使用してSnowflakeを使用するときなど、コマンドを受け付けなくなってしまいセッションごと停止したい場合が稀にあると思います。

そんな時に、SYSTEM$ABORT_SESSION関数が便利です。

SYSTEM$ABORT_SESSION

引数に入れたセッションIDのセッションを中止します。

セッションIDについては、CURRENT_SESSION関数を使うか、ACCOUNTADMINロールで、アカウントタブ⇒セッションで確認可能です。

select current_session();

以下は、クエリサンプルです。

select system$abort_session(1065153868222);

実行中のクエリをキャンセルしたい

実行中のクエリのキャンセルを、システム関数から可能です。異常に時間がかかっているクエリがあってキャンセルしたいときは、この章で説明する2つのシステム関数が便利です。

SYSTEM$CANCEL_QUERY

引数に入れたクエリIDが実行中の場合、そのクエリの実行をキャンセルします。

クエリIDについては、履歴タブから確認が可能です。

以下は、クエリサンプルです。

select system$cancel_query('d5493e36-5e38-48c9-a47c-c476f2111ce5');

SYSTEM$CANCEL_ALL_QUERIES

引数に入れたセッションIDが実行中のクエリを全てキャンセルします。

セッションIDについては、CURRENT_SESSION関数を使うか、ACCOUNTADMINロールで、アカウントタブ⇒セッションで確認可能です。

select current_session();

以下は、クエリサンプルです。

select system$cancel_all_queries(1065153872298);

参考情報

システム関数ではないのですが、対象のウェアハウス上で実行中またはキューに入っているすべてのクエリを中止するにはALTER WAREHOUSE ... ABORT ALL QUERIESコマンド、ユーザーが現在実行またはスケジュールしているすべてのクエリおよびその他のSQLステートメントを中止したい場合にはALTER USER ... ABORT ALL QUERIESコマンドが使用できます。

こちらも併せて覚えておくとよいと思います。

親子関係にあるタスクをまとめて再開したい

クエリをスケジューリングしてバッチ処理的に実行できる機能としてタスクがありますが、複数のタスクに依存関係を持たせて連続して実行することも可能です。

しかし、タスクは設定後すべてのタスクに対して1つ1つALTER TASK ... RESUMEコマンドを実行しないといけません。正直、面倒くさいですよね。笑

そんなとき、最上位の親であるタスクを指定するだけで下位に位置するタスクを全てRESUME出来る関数として、SYSTEM$TASK_DEPENDENTS_ENABLE関数があります。

SYSTEM$TASK_DEPENDENTS_ENABLE

引数に入れたタスクに依存している下位タスクを全てまとめてRESUME出来ます。

select system$task_dependents_enable('mydb.myschema.mytask');

次回

Snowflakeをより使いこなそう! Advent Calendar 2021、次回の14日目では、「Snowflakeで知っていると便利なシステム関数についてまとめてみた~情報関数編~ 」というタイトルで執筆します。お楽しみに!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.